/**
 * 
 */
package br.gov.sjc.aluguelsocial;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import br.gov.sjc.classes.NumeroSias;
import br.gov.sjc.dao.BaseDAO;
import br.gov.sjc.utils.ManipulaData;
import br.gov.sjc.utils.Sair;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

/**
 * @author rodrigo.ramos
 *
 */
public class NomeActivity extends Sair implements OnClickListener  {
	String TAG = "NomeActivity";
	static final int DATE_DIALOG_ID = 0;

	//Declara base de dados
	public static SQLiteDatabase BancoDados = null;
	public static String nomeBanco = BaseDAO.DATABASE_NAME;
	public void openDB(){
		try{
			BancoDados = openOrCreateDatabase(nomeBanco,MODE_WORLD_READABLE,null);
			Log.v("NomeActivity", "BancoDados.openOrCreateDatabase();");
		}catch (Exception E){
			Log.e("NomeActivity", "Erro em BancoDados.close();"+E.getMessage());
		} 
	}
	public void closeDB(){
		BancoDados.close();
		Log.v("NomeActivity", "BancoDados.close();");
	}

	// Declara Buttons
	Button btnNVoltar, btnNIr, btnNPesq, btnDataNascimento;

	//Declara Variáveis
	String data, datahojeymd;
	String dataymd = "";

	//Declara TextBox
	EditText tbNome,tbNomeNasc,tbNomeMae, tbNomePai,tbNaturalidade ;
	AutoCompleteTextView actvNaturalidade;
	CheckBox ckTitular, ckExcluido;
	Spinner spParentesco;

	//Declara base de dados
	//SQLiteDatabase bd = AluguelSocialAct.BancoDados ;

	//Pega o numero do Sias em uso atual
	NumeroSias ns = new NumeroSias();
	int NumSias = ns.getNumeroDaFamilia();
	int idMembroSias = ns.getNumeroDoMembroDaFamilia();
	int ID = idMembroSias;

	//Declara Cursor
	Cursor cVerifica;

	@Override
	protected Dialog onCreateDialog(int id) {
		Calendar calendario = Calendar.getInstance();

		int ano = calendario.get(Calendar.YEAR);
		int mes = calendario.get(Calendar.MONTH);
		int dia = calendario.get(Calendar.DAY_OF_MONTH);

		switch (id) {
		case DATE_DIALOG_ID:
			return new DatePickerDialog(this, mDateSetListener, ano, mes,
					dia);
		}
		return null;
	}
	private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			data = String.valueOf(dayOfMonth) + "-"
					+ String.valueOf(monthOfYear+1) + "-" + String.valueOf(year);
			Toast.makeText(NomeActivity.this,
					"DATA = " + data, Toast.LENGTH_SHORT)
					.show();
			dataymd =String.valueOf(year) + "-"
					+  String.valueOf(monthOfYear+1) + "-" + String.valueOf(dayOfMonth);
			btnDataNascimento.setText(data); 
		}
	};
	public void onClick(View v) {
		if (v == btnDataNascimento)
			showDialog(DATE_DIALOG_ID);
	}
	public void dataHoje(){
		Calendar calendario = Calendar.getInstance();
		int ano = calendario.get(Calendar.YEAR);
		int mes = calendario.get(Calendar.MONTH);
		int dia = calendario.get(Calendar.DAY_OF_MONTH);
		data = String.valueOf(dia) + "-"+ String.valueOf(mes+1) + "-" + String.valueOf(ano);
		btnDataNascimento.setText(data);
		datahojeymd = data;
	}
	public String dataHojeymd(){

		Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT -3"));
		int ano = cal.get(Calendar.YEAR);
		int mes = cal.get(Calendar.MONTH);
		int dia = cal.get(Calendar.DAY_OF_MONTH);
		String data =  String.valueOf(ano) + "-"+ String.valueOf(mes+1) + "-" + String.valueOf(dia);

		return data;
	}
	/** Called when the activity is first created. *******************************************/
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.nome);
		registerBaseActivityReceiver();
		Log.v("NomeActivity", "Inicio idMembroN= "+idMembroSias+" NumSias="+NumSias);
		

		tbNome = (EditText) findViewById(R.nome.tbNome);
		tbNomeMae = (EditText) findViewById(R.nome.tbNomeMae);
		tbNomePai = (EditText) findViewById(R.nome.tbNomePai);
		btnNVoltar = (Button) findViewById(R.nome.btnVoltar);
		btnNIr = (Button) findViewById(R.nome.btnIr);
		btnDataNascimento = (Button) findViewById(R.nome.btnDataNascimento);
		btnDataNascimento.setOnClickListener(this);
		
		ckTitular = (CheckBox) findViewById(R.nome.ckTitular);
		ckExcluido = (CheckBox) findViewById(R.nome.ckExcluido);

		//showDialog(DATE_DIALOG_ID);
		dataHoje();

		actvNaturalidade = (AutoCompleteTextView) findViewById(R.nome.actvNaturalidade);
		ArrayAdapter<CharSequence> adpactvNaturalidade = ArrayAdapter.createFromResource(
				this, R.array.Cidade,
				android.R.layout.simple_list_item_1);
		actvNaturalidade.setAdapter(adpactvNaturalidade);
		
		spParentesco = (Spinner) findViewById(R.nome.spParentesco);
		ArrayAdapter<CharSequence> adpParentesco = ArrayAdapter.createFromResource(
				this, R.array.Parentesco,
				android.R.layout.simple_spinner_item);
		adpParentesco.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spParentesco.setAdapter(adpParentesco);

		/** Inicia o set de dados caso haja dados */
		if (verificaRegistro(NumSias)){
			setarDados(ID);
			Log.v("NomeActivity", "onCreate() Com dados do SiasN: "+NumSias+"ID: "+ID);
		}else{
			//Num tem seNão
			Log.v("NomeActivity", "onCreate() Com dados vazios ");
		}


		/** Acao do botao Voltar */

		btnNVoltar.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				/** InitComponents */
				Intent ittNVoltar = new Intent(getApplicationContext(), GrupoFamiliarActivity.class);
				
				startActivity(ittNVoltar);
			}
		});//fim acao do botao voltar

		/** Acao do botao Prox */

		btnNIr.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {

				//Valida os campos e d� prosseguimento
				validaRegistro();
			}
		});//fim acao do botao Prox


	}
	protected void validaRegistro() {
		// valida registros antes de serem persistidos na tabela
		//tbNomeMae, tbNomePai,tbNaturalidade ;
		int erro = 0;

		if (btnDataNascimento.getText().equals("")){
			Toast.makeText(this, "Campo Data de Nascimento está Vazio", Toast.LENGTH_LONG).show();
			erro++;
		}else{
			ManipulaData data = new ManipulaData();
			try {
				if (data.DataOk(btnDataNascimento.getText().toString())){
					if (data.DataMaiorQueHoje(btnDataNascimento.getText().toString())){
						Toast.makeText(this, "A Data de Nascimento deve ser inferior a hoje.", Toast.LENGTH_LONG).show();
						Log.w(TAG, "validaRegistro - Data maior que hoje ou Inválida:"+btnDataNascimento.getText().toString());
						erro++;
					}
					if (data.MaiorQue1900(btnDataNascimento.getText().toString())){
						Log.v(TAG, "validaRegistro - Data maior que 1900:"+btnDataNascimento.getText().toString());
						
					}else{
						Toast.makeText(this, "Verifique a Data de Nascimento", Toast.LENGTH_LONG).show();
						Log.w(TAG, "validaRegistro - Data maior que hoje ou Inválida:"+btnDataNascimento.getText().toString());
						erro++;
					}
				}else{
					Toast.makeText(this, "Data de Nascimento Inválida", Toast.LENGTH_LONG).show();
					Log.w(TAG, "validaRegistro - Data maior que hoje ou Inválida:"+btnDataNascimento.getText().toString());
					erro++;
				}
			} catch (Exception e) {
				e.printStackTrace();
				Toast.makeText(this, "Verifique o campo de Data ", Toast.LENGTH_LONG).show();
				Log.w(TAG, "validaRegistro - Data Inválida: "+e.getMessage()+" /");
				erro++;
			}
		}
		if (ckTitular.isChecked() && ckExcluido.isChecked()){
			Toast.makeText(this, "Não é possível excluir o membro titular", Toast.LENGTH_LONG).show();
			Log.e(TAG, "validaRegistro - ckTitular.isChecked() & ckExcluido.isChecked():"+ckTitular.isChecked() +" & "+ ckExcluido.isChecked());
			erro++;
		}
		if (ckTitular.isChecked()&& temTitular(NumSias)){
				Toast.makeText(this, "Já existe um titular para a Família:"+NumSias, Toast.LENGTH_LONG).show();
				Log.e(TAG, "validaRegistro - temTitular(NumSias):"+temTitular(NumSias)+" NumSias:"+NumSias);
				erro++;
		}
		if (!spParentesco.getSelectedItem().toString().equals("O próprio") && ckTitular.isChecked() ){
			Toast.makeText(this, "Verifique a relação entre Parentesco e Titular", Toast.LENGTH_LONG).show();
			Log.e(TAG, "validaRegistro - Parentesco(O próprio) != de Titular");
			erro++;
		}
		if (spParentesco.getSelectedItem().toString().equals("O próprio") && !ckTitular.isChecked() ){
			Toast.makeText(this, "Verifique a relação entre Parentesco e Titular", Toast.LENGTH_LONG).show();
			Log.e(TAG, "validaRegistro - Parentesco(O próprio) != de Titular");
			erro++;
		}
		if(tbNome.getText().toString().equals("")){
			Toast.makeText(this, "Campo Nome está Vazio", Toast.LENGTH_LONG).show();
			erro++;
		}
		if(tbNomeMae.getText().toString().equals("")){
			Toast.makeText(this, "Campo Nome da Mãe está Vazio", Toast.LENGTH_LONG).show();
			erro++;
		}
		if(actvNaturalidade.getText().toString().equals("")){
			Toast.makeText(this, "Campo Naturalidade está Vazio", Toast.LENGTH_LONG).show();
			erro++;
		}
	    ArrayAdapter<CharSequence> adpChar = ArrayAdapter.createFromResource(
		        this, R.array.Cidade,
		        android.R.layout.simple_spinner_item);
	    //adpChar.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    	int position = adpChar.getPosition(actvNaturalidade.getText().toString());
		if(position < 0){
			Toast.makeText(this, "Campo Naturalidade está Com Valor Inválido", Toast.LENGTH_LONG).show();
			erro++;
		}


		if (erro == 0) {

			if (verificaRegistro(NumSias)){
				alteraRegistro(ID);
			}else{
				String Titular = "";
				String Excluido = "";
				if (ckTitular.isChecked()){
					Titular = "Sim";
				}else{
					Titular = "Não";
				}
				if (ckExcluido.isChecked()){
					Excluido = "Sim";
				}else{
					Excluido = "Não";
				}
				Log.w(TAG,"validaRegistro - Titular:"+Titular+" / Excluido:"+Excluido);
				//salva dados
				salvaDados(NumSias,idMembroSias,tbNome.getText().toString(),data
						,tbNomeMae.getText().toString(),tbNomePai.getText().toString(),actvNaturalidade.getText().toString()
						,Titular,Excluido,spParentesco.getSelectedItem().toString() );

				Toast.makeText(this, "Gravando Dados da Família:"+NumSias+"/"+idMembroSias, Toast.LENGTH_LONG).show();
			}  
			if (ckExcluido.isChecked()){
			/** 
			 * InitComponents ----- 
			 * */
			Intent ittNIr = new Intent(getApplicationContext(),GrupoFamiliarActivity.class);
			
			startActivity(ittNIr);
			}else{
				/** InitComponents */
				Intent ittNVoltar = new Intent(getApplicationContext(), DadosPessoaisActivity.class);
				
				startActivity(ittNVoltar);
			}
			
		}

	}

	public void salvaDados(int numerodosias, int string2, String string3, String string4, String string5, String string6, String string7, String string8, String string9, String string10){
		openDB();
		try{

			String SQL = "INSERT INTO tab_Nome(SiasN , idMembro, Nome ,DNasc , NomeMae , " +
					"NomePai , NaturalCidade, Titular, Excluido, Parentesco ) "+
					"VALUES ('"+numerodosias+"', "+string2+",'"+string3+"', '"+string4+"','"+string5+"', '" +
					""+string6+"', '"+string7+"', '"+string8+"', '"+string9+"', '"+string10+"')";
			BancoDados.execSQL(SQL);
			Log.v("NomeActivity", "salvaDados passou;");
		}catch(Exception erro) {
			mensagemAlerta("Erro","Erro Ao Gravar ");
			Log.e("NomeActivity", "BancoDados.erro"+erro.getMessage());
		}
		closeDB();
	}
 
	public boolean verificaRegistro(int NumeroSias){
		boolean Retorno = false;
		openDB();
		try{
			
			String SQLQuery = "Select * from tab_Nome WHERE SiasN="+NumSias+" AND idMembro="+idMembroSias;
			Log.w(TAG,"NumeroSias:"+NumeroSias+" NumSias:"+NumSias+" idMembroSias:"+idMembroSias);
			
			cVerifica = BancoDados.rawQuery(SQLQuery, null);
			if (cVerifica.getCount() !=0 ){
				cVerifica.moveToFirst();
				ID = cVerifica.getInt(cVerifica.getColumnIndex("_id"));
				Retorno = true;
				Log.i("NomeActivity", "verificaRegistro() TRUE ");
			}
		}catch (Exception Err){
			//mensagemAlerta("Erro","Erro Encontrado:"+Err.getMessage());
			Log.e("NomeActivity", "verificaRegistro() "+Err.getMessage());
		}
		closeDB();
		return Retorno;

	}
	/**
	 * Retorna true se ja existe um titular para o nsias informado
	 * Retorna false caso exista 1 
	 * @param NumeroSias
	 * @return true or false
	 */
	public boolean temTitular(int NumeroSias){
		boolean Retorno = true;
		openDB();
		try{
			String SQLQuery = "Select * from tab_Nome WHERE Titular=\"Sim\" AND SiasN="+NumeroSias;
			Cursor cVerifica2 = BancoDados.rawQuery(SQLQuery, null);
			int counter = cVerifica2.getCount();
			cVerifica2.moveToFirst();
			if ( counter == 1 ){
				if (cVerifica2.getInt(cVerifica2.getColumnIndex("_id"))==ID){
					Retorno = false; //deixa inserir um novo titular (para edi��o)
					Log.i(TAG, "temTitular() false ");
				}else{
					Log.i(TAG, "temTitular() true ");
				}
				
			}else if(counter==0){
				Retorno = false; //deixa inserir um novo titular 
				Log.i(TAG, "temTitular() false ");
			}
		}catch (Exception Err){
			Log.e(TAG, "temTitular() "+Err.getMessage());
		}
		closeDB();
		return Retorno;
	}

	public void setarDados(int Posicao){
		openDB();
		try {
			String SQL2 = "SELECT * FROM tab_Nome WHERE _id="+Posicao+" ";
			Log.v(TAG, "setarDados() Posição: "+Posicao);
			Cursor c = BancoDados.rawQuery(SQL2, null);
			c.moveToFirst();

			do {
				tbNome.setText(c.getString(c.getColumnIndex("Nome")));
				btnDataNascimento.setText(c.getString(c.getColumnIndex("DNasc")));
				//dataymd = c.getString(c.getColumnIndex("DNasc"));
				tbNomeMae.setText(c.getString(c.getColumnIndex("NomeMae")));
				tbNomePai.setText(c.getString(c.getColumnIndex("NomePai")));
				actvNaturalidade.setText(c.getString(c.getColumnIndex("NaturalCidade")));
				String titular = c.getString(c.getColumnIndex("Titular"));
				String excluido = c.getString(c.getColumnIndex("Excluido"));
				Log.w(TAG,"excluido:"+excluido+"/titular:"+titular);
    			if (titular != null){
				if (titular.equals("Sim")){
					ckTitular.setChecked(true);
				}else {
					ckTitular.setChecked(false);
				}
    			}
    			else{
    				ckTitular.setChecked(false);
    			}
    			if (excluido != null){
				if (excluido.equals("Sim")){
					ckExcluido.setChecked(true);
				}else {
					ckExcluido.setChecked(false);
				}
    			}else{
    				ckExcluido.setChecked(false);
    			}
			    ArrayAdapter<CharSequence> adpParentesco = ArrayAdapter.createFromResource(
    			        this, R.array.Parentesco,
    			        android.R.layout.simple_spinner_item);
			    adpParentesco.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		    			int iParentesco = adpParentesco.getPosition(c.getString(c.getColumnIndex("Parentesco")));
		    			spParentesco.setSelection(iParentesco);
			}while(c.moveToNext());

			Log.v("NomeActivity", "setarDados() TRUE ");
		}catch (Exception E){
			mensagemAlerta("Erro","Ocorreu um erro inesperado");
			Log.e("NomeActivity", "Erro em setarDados() "+E.getMessage());
		}
		closeDB();
	}

	public void alteraRegistro(int id){
		String Titular = "";
		String Excluido = "";
		if (ckTitular.isChecked()){
			Titular = "Sim";
		}else{
			Titular = "Não";
		}
		if (ckExcluido.isChecked()){
			Excluido = "Sim";
		}else{
			Excluido = "Não";
		}
		Log.w(TAG,"alteraRegistro - Titular:"+Titular+" / Excluido:"+Excluido);
		openDB();
		try{
			String uSQL = "UPDATE tab_Nome SET " +
					" Nome='"+tbNome.getText().toString()+"'," +
					" DNasc='"+btnDataNascimento.getText().toString()+"'," +
					" NomeMae='"+tbNomeMae.getText().toString()+"'," +
					" NomePai='"+tbNomePai.getText().toString()+"'," +
					" Titular='"+Titular+"'," +
					" Excluido='"+Excluido+"'," +
					" Parentesco='"+spParentesco.getSelectedItem().toString()+"'," +
					" NaturalCidade='"+actvNaturalidade.getText().toString()+"'" +
					" WHERE _id="+id+" ";
			BancoDados.execSQL(uSQL);
			Toast.makeText(NomeActivity.this, "Alterado", Toast.LENGTH_LONG).show();
			Log.v("NomeActivity", "alteraRegistro() realizado com sucesso ");
		}catch(Exception Err){
			mensagemAlerta("Erro","Ocorreu um erro inesperado");
			Log.e("NomeActivity", "alteraRegistro() erro: "+Err.getMessage());

		}
		closeDB();

	}

	public void mensagemAlerta(String AlertTitle, String MSGAlert){
		AlertDialog.Builder Mensagem = new AlertDialog.Builder(NomeActivity.this);
		Mensagem.setTitle(AlertTitle);
		Mensagem.setMessage(MSGAlert);
		Mensagem.setNeutralButton("Ok", null);
		Mensagem.show();
	}
	@Override
	protected void onResume() {
		//quando a Activity main receber o foco novamente abre-se novamente a conexão
		
		//método responsável pela atualiza da lista de dados na tela
		//adapter.notifyDataSetChanged();
		super.onResume();
	}
	@Override
	protected void onPause() {

		//toda vez que o programa peder o foco fecha-se a conexão com o BD
		super.onPause();
	}
    @Override
    protected void onDestroy() {
    	super.onDestroy();
    	unRegisterBaseActivityReceiver();
    	finish();
    }
}
